package com.byron.pss.web.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.byron.pss.dao.IUserDAO;
import com.byron.pss.dao.impl.UserDAOImpl;
import com.byron.pss.domain.Const;
import com.byron.pss.domain.User;
import com.byron.pss.util.StringUtils;

/**
 * 做登陆验证的的Servlet，唯一来源：login.jsp
 * @author Byron
 *
 */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
	
	/**
	 * 用户操作dao
	 */
	private IUserDAO userDao = new UserDAOImpl();

	private static final long serialVersionUID = 1L;

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String login = req.getParameter("cmd");
		if(!StringUtils.hasLength(login)){
			//login为空值，说明不是登录，不需要验证，直接放行
			resp.sendRedirect(req.getContextPath() + "/unchecked/login.jsp");
			return;
		}
		// ===============验证码验证=================
		if (!checkImagecode(req, resp)) {
			// 没有验证通过就直接跳转到登陆界面:这里要用请求转发，因为要携带数据过去，errorMsg
			req.getRequestDispatcher("/unchecked/login.jsp").forward(req, resp);
			return;
		}

		// =================登陆验证====================
		if (checkUsernamePassword(req, resp)) {
			// 登陆成功，跳转到显示数据的主界面
			resp.sendRedirect(req.getContextPath() + "/lostfound?cmd=list");
		} else {
			req.getRequestDispatcher("/unchecked/login.jsp").forward(req, resp);
		}
	}

	/**
	 * 检查用户名和密码是否正确,，另外有errorMsg中已经封装了错误信息
	 * @param req 请求信息
	 * @param resp 响应信息
	 * @return true 验证通过用户名，false表示验证失败
	 */
	private boolean checkUsernamePassword(HttpServletRequest req,
			HttpServletResponse resp) {
		// 拿到登陆邮箱密码
		String email = req.getParameter("email");
		String password = req.getParameter("password");

		// 判断项：已经输入了值+查询数据库发现存在该用户
		if (StringUtils.hasLength(email) && StringUtils.hasLength(password)
				&& userDao.isExist(email, password)) {
			// 用户存在，在Session中将username存储起来
			HttpSession session = req.getSession();
			User user = userDao.getUser(email);
			session.setAttribute(Const.USERNAME_IN_SESSION, user.getUsername());
			return true;
		} else {
			// 首次登陆，获取用户名密码错误，转到登陆界面
			req.setAttribute("upMsg", "用户名或密码错误");
			return false;
		}
	}

	/**
	 * 检测验证码是否正确，另外有errorMsg中已经封装了错误信息
	 * @param req 请求信息
	 * @param resp 响应信息
	 * @return true表示成功，false表示错误
	 */
	private boolean checkImagecode(HttpServletRequest req,
			HttpServletResponse resp) {
		// 拿到用户的验证码
		String imagecode = req.getParameter("imagecode");
		// 拿到session中存储的验证码
		String randomcode_in_session = (String) req.getSession().getAttribute(
				Const.RANDOMCODE_IN_SESSION);
		int check = StringUtils.check(imagecode, randomcode_in_session);
		if (check == 1) {
			// 验证不通过，提示验证码输入错误
			req.setAttribute("errorMsg", "验证码输入错误");
			return false;
		}
		if (check == 2) {
			// 返回到页面，并且提示一个错误信息
			req.setAttribute("errorMsg", "验证码不能为空");
			return false;
		}
		return true;
	}
}
